package modelos.daos;

import controladores.ManejadorBaseDatos;
import modelos.pojos.SalaEventos;
import java.sql.*;
import java.util.*;

public class SalaEventosDAO {

    private static Connection con;
    public static List<SalaEventos> disponibles;
    public static List<SalaEventos> resultados;

    public static void crear(SalaEventos salaEventos) throws SQLException, Exception {

        ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
        mbd.conectar();
        con = mbd.getConexion();

        if (con == null) {
            throw new SQLException(" no hay conexion ");
        }

        PreparedStatement pst = null;

        try {
            pst = con.prepareStatement("Insert Into SalaEventos values(?,?,?,?,?)");
            pst.setString(1, null);
            pst.setString(2, salaEventos.getNumero());
            pst.setInt(3, salaEventos.getCapacidad());
            pst.setString(4, salaEventos.getDescripcion());
            pst.setString(5, salaEventos.getEstado() + "");
            pst.executeUpdate();


        } finally {

            if (pst != null) {
                pst.close();
            }
        }
    }

    public static SalaEventos consultar(String numero) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        SalaEventos sala = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from SalaEventos where numero = ?");
            pst.setString(1, numero);

            rs = pst.executeQuery();

            while (rs.next()) {
                sala = SalaEventos.cargarDatos(rs);

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return sala;
        }
    }
    
    public static SalaEventos consultarPorId(int id) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        SalaEventos sala = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from SalaEventos where id = ?");
            pst.setInt(1, id);

            rs = pst.executeQuery();

            while (rs.next()) {
                sala = SalaEventos.cargarDatos(rs);

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return sala;
        }
    }

    public static List consultarDisponibles(int aproximadoAsistentes) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        disponibles = new LinkedList<SalaEventos>();

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from SalaEventos where capacidad >= ? AND estado=?");
            pst.setInt(1, aproximadoAsistentes);
            pst.setString(2, "a");
            rs = pst.executeQuery();

            while (rs.next()) {
                disponibles.add(SalaEventos.cargarDatos(rs));

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return disponibles;
        }
    }
    
    public static List consultarDisponiblesPorFecha(java.util.Date fecha) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        disponibles = new LinkedList<SalaEventos>();

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select SalaEventos.* from SalaEventos inner join ReservaSala on SalaEventos.id != ReservaSala.idSala and SalaEventos.estado = 'a' and ReservaSala.estado='a' and ? between ReservaSala.fechaProg and ReservaSala.fechaProg;");
            pst.setTimestamp(1, new Timestamp(fecha.getTime()));
            rs = pst.executeQuery();

            while (rs.next()) {
                disponibles.add(SalaEventos.cargarDatos(rs));

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return disponibles;
        }
    }

    public static void actualizar(SalaEventos salaEventos) throws SQLException, Exception {
        int id = salaEventos.getId();

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update SalaEventos Set numero=?,capacidad=?, descripcion=?,estado=? Where id=?");
            pst.setString(1, salaEventos.getNumero());
            pst.setInt(2, salaEventos.getCapacidad());
            pst.setString(3, salaEventos.getDescripcion().trim());
            pst.setString(4, salaEventos.getEstado() + "");
            pst.setInt(5, id);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static List listar(String numero) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from SalaEventos where numero like ?");
            pst.setString(1, "%" + numero + "%");

            rs = pst.executeQuery();

            while (rs.next()) {
                if (resultados == null) {
                    resultados = new LinkedList<SalaEventos>();
                }
                resultados.add(SalaEventos.cargarDatos(rs));

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static void eliminar(String numero) throws SQLException, Exception {
        if (consultar(numero) == null) {
            throw new SQLException("");
        }
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("delete from SalaEventos where numero = ?");
            pst.setString(1, numero);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    } 
}
